package com.roads.project.service;

import java.math.BigDecimal;
import java.util.List;

import com.roads.common.core.domain.entity.SysUser;
import com.roads.project.domain.ProBoq;
import com.roads.project.domain.ProBoqMeterage;
import org.apache.ibatis.annotations.Param;

/**
 * 标段清单Service接口
 * 
 * @author nhp
 * @date 2021-11-30
 */
public interface IProBoqService {

    /**
     * 查询标段清单
     * 
     * @param id 标段清单主键
     * @return 标段清单
     */
    ProBoq selectProBoqById(Long id);

    /**
     * 根据清单编号和机构编号查询清单
     *
     * @param institutionCode 机构编号
     * @param boqCode 清单编号
     * @return 清单
     */
    ProBoq selectProBoqByCode(String institutionCode, String boqCode);

    /**
     * 校验清单编号是否唯一
     *
     * @param proBoq 清单实体
     * @return 结果
     */
    String checkBoqCodeUnique(ProBoq proBoq);

    /**
     * 查询标段清单列表
     * 
     * @param proBoq 标段清单
     * @return 标段清单集合
     */
    List<ProBoq> selectProBoqList(ProBoq proBoq);

    /**
     * 根据标段编号和清单编号查询子节点
     *
     * @param institutionCode 标段编号
     * @param boqCode 清单编号
     * @return 标段工程量清单集合
     */
    List<ProBoq> selectChildrenList(String institutionCode, String boqCode);

    /**
     * 查询标段清单树形列表(名称=清单编号+清单名称)
     *
     * @param proBoq 标段清单
     * @return 标段清单集合
     */
    List<ProBoq> selectProBoqTreeList(ProBoq proBoq);

    /**
     * 查询标段清单列表(名称=清单编号+清单名称)
     *
     * @param proBoq 标段清单
     * @return 标段清单集合
     */
    List<ProBoq> selectLeafNodeList(ProBoq proBoq);

    /**
     * 查询标段清单大类列表（名称=清单编号+清单名称）
     * @param proBoq
     * @return
     */
    List<ProBoq> selectBigTypeList(ProBoq proBoq);

    /**
     * 新增标段清单
     * 
     * @param proBoq 标段清单
     * @return 结果
     */
    int insertProBoq(ProBoq proBoq);

    /**
     * 修改标段清单
     * 
     * @param oldBoq 修改前标段清单
     * @param proBoq 修改标段清单
     * @param meterageList 计量清单集合
     * @return 结果
     */
    int updateProBoq(ProBoq oldBoq,ProBoq proBoq, List<ProBoqMeterage> meterageList);

    /**
     * 批量删除标段清单
     * 
     * @param ids 需要删除的标段清单主键集合
     * @return 结果
     */
    int deleteProBoqByIds(Long[] ids);

    /**
     * 删除标段清单信息
     * 
     * @param id 标段清单主键
     * @return 结果
     */
    int deleteProBoqById(Long id);

    /**
     * 清空标段工程量清单
     *
     * @param institutionCode 标段编号
     */
    void clean(String institutionCode);

    /**
     * 导入标段清单
     *
     * @param dataList 数据集合
     * @param userName 登录用户
     * @param institutionCode 机构编号
     * @return 结果
     */
    String importData(List<ProBoq> dataList, String userName, String institutionCode);

    /**
     * 工程量清单汇总
     *
     * @param institutionCode 机构编号
     * @return 结果
     */
    int summary(String institutionCode);

    /**
     * 根据项目ID，用户查询变更金额
     *
     * @param projectId 项目id
     * @param user 用户
     * @param isAdmin 是否管理员
     * @return 变更金额
     */
    BigDecimal getChangeTotal(Integer projectId, SysUser user, boolean isAdmin);

}
